

{-Y el winner en 4 lineas y una funcion sola!-}

itsRef = ["0","1","2","3","4","5","6","7","8","9"]
intToString :: Int -> String
intToString n | n `mod` 10 /= n = intToString (n `div` 10) ++ (itsRef !! (n `mod` 10))
              | otherwise = (itsRef !! (n `mod` 10))
        
{-Una mejor! (Creo)-}

--Creo que este intToString es un poco menos optimo pero es 1 sola funcion.

intToString2 :: Int -> String
intToString2 n | n `div` 10 /= 0 =  intToString2(n `div` 10) ++ convertirUltima n
               | otherwise = convertirUltima n
               
convertirUltima :: Int -> String
convertirUltima n = itsRef !! (cascabel (dameCifras2 n))

cascabel :: [a] -> a
cascabel a = a !! (length a -1) 

--Dame Cifras super optimizado!

dameCifras2 :: Int -> [Int]
dameCifras2 n | n `mod` 10 /= n = dameCifras2 (n `div` 10) ++ [(n `mod` 10)]
              | otherwise = [(n `mod` 10)]

{-Antigua que le gusto a mata-}

intToString0 :: Int -> String
intToString0 n = intToStringAux (dameCifras n)

intToStringAux :: [Int] -> String
intToStringAux [] = ""
intToStringAux (x:xs) = (itsRef !! x) ++ (intToStringAux xs)

dameCifras :: Int -> [Int]
dameCifras n = dameCifrasAux n 0

dameCifrasAux :: Int -> Int -> [Int]
dameCifrasAux n 0 = (dameCifrasAux n 1) ++ []
dameCifrasAux n i | ( n `mod` (10 ^ i) ) /= n = dameCifrasAux n (i+1) ++ [calcularCifra n i]
                  | otherwise = [calcularCifra n i]

calcularCifra :: Int -> Int -> Int
calcularCifra n 1 = n `mod` 10
calcularCifra n i = ( ( n `mod` 10 ^ i ) - ( n `mod` 10 ^ (i-1) ) ) `div` 10 ^ (i-1)






